<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script>
     /*    Object.defineProperties(object, descriptors)对某个对象进行多属性的统一定义属性功能描述
            object:将要添加属性的目标对象
            descriptors：取值类型是对象，可以是需要定义的属性名称，value是该属性的相关描述，value的取值是对象(相关的描述符) */
        var user={};
        var num=20;
        var u=Object.defineProperties(user,{
            username:{
                value:"黄晓明",
                writable:true,
                enumerable:true,
                configurable:true
            },
            age:{
                get(){
                    return num;
                },
                set(val){
                    num=val;
                },
                configurable:false,
                enumerable:true
            }
        });
        console.log(user);
        console.log(u);


        // Object.getOwnPropertyDescriptor(object, propertyName)：从一个对象中获取指定属性的相关信息(相关的描述符)
        // object:被操作的对象
        // propertyName：对象的属性名，取值是字符串
        // 返回值是一个对象,包含属性相关信息(相关的描述符)
        var usernameDesc=Object.getOwnPropertyDescriptor(user,"username");
        console.log(usernameDesc);

        // Object.getOwnPropertyNames(object)： 获取指定对象中的所有的属性名称，并返回一个属性名组成数组(包含不能循环的属性)
        var keys=Object.getOwnPropertyNames(user);
        console.log(keys);

        // Object.preventExtensions(object)：限定指定对象不能添加新属性
        var user2={name:"alice"};
        Object.preventExtensions(user2);
        user2.age=45;
        
        
        // Object.isExtensible(object):判断指定对象是否可以添加新属性
        console.log(Object.isExtensible(user2));

        // console.log(delete user2.name);//可以删除
        // console.log(user2);

        // Object.seal(object)：限定对象不能添加新的属性，也不能删除属性
        var user3={
            username:"tom",
            age:20
        };
        Object.seal(user3);
        user3.hobby="吃饭";//添加属性
        delete user3.username;//删除属性
        console.log(user3);

        // Object.isSealed(object):判断这个对象是否已密封，返回的是一个布尔值
        console.log(Object.isSealed(user3));

        // Object.freeze(object)：限定对象不能添加新的属性，也不能删除属性，也不能修改属性
        var user4={
            username:"tom",
            age:20
        };
        Object.freeze(user4);
        user4.hobby="吃饭";
        delete user4.age;
        user4.username="lucy";
        console.log(user4);


        // Object.isFrozen(object)判断对象是否被冻结，返回的是布尔值
        console.log(Object.isFrozen(user4));




    </script>
</head>
<body>
    
</body>
</html>